Static Strategy

템플릿을 사용하면, 자동으로 타입에 맞추어 전략을 적용할 수 있다.
template <typename LS>
struct TextProcessor{
void append_list(const vector<string> items){
list_strategy.start(oss);
for(auto& item: items) list_strategy.add_list_item(oss, item);
list_strategy.end(oss);
}
// dynamic strategy
private:
ostringstream oss;
LS list_strategy;
};
//
//markdown
TextProcessor<MarkdownListStrategy> tpm;
tpm.append_list({"foo", "bar", "baz"});
cout<<tpm.str()<<endl;
// html
TextProcessor<GtmlListStrategy> tph;
tph.append_list({"foo", "bar", "baz"});
cout<<tph.str()<<endl;
전략 디자인 패턴은 알고리즘의 골격만을 정의하고, 세부 구현은 컴포지션으로서
특정 전략을 선택적으로 채워넣을 수 있다.

- 동적 전략:
사용될 전략을 포인터 또는 참조자로서 가진다. 전략을 바꾸고 싶은 경우, 참조를 변경한다.
- 정적 전략:
컴파일 시점에 전략이 선택되어 고정되도록 한다. 나중에 전략을 바꾸는 것이 불가능함

std::variant로 전략을 전달할 경우, 이외의 전략의 목록을 제한할 수 있다.